// Copyright 2017 Elias Kosunen
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// This file is a part of scnlib:
//     https://github.com/eliaskosunen/scnlib

#include <scn/scan.h>

struct mytype {
    int value;
};

template <>
struct scn::scanner<mytype> : public scn::scanner<int> {
    template <typename ParseCtx>
    constexpr auto parse(ParseCtx& pctx) -> typename ParseCtx::iterator
    {
        if (!pctx.is_source_contiguous() || !pctx.is_source_borrowed()) {
            pctx.on_error("Invalid source for mytype");
        }
        return scn::scanner<int>::parse(pctx);
    }

    template <typename Ctx>
    auto scan(mytype& val, Ctx& ctx) const
        -> scn::scan_expected<typename Ctx::iterator>
    {
        return scn::scanner<int>::scan(val.value, ctx);
    }
};

int main()
{
    // build error: Invalid source for mytype
    auto result = scn::scan<mytype>(stdin, SCN_STRING("{}"));
    return !result.has_value();
}
